package com.xianrenit.xianrenpuzi.pay.controller;

import com.xianrenit.xianrenpuzi.model.result.Result;
import com.xianrenit.xianrenpuzi.pay.service.AlipayService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@Tag(name = "支付宝支付模块")
@Slf4j
@RequestMapping("/api/order/alipay")
public class AlipayController {
    @Resource
    AlipayService alipayService;

    @Operation(summary = "支付宝-获取支付页接口")
    @GetMapping("/submitAlipay/{orderId}")
    public Result submitAlipay(@PathVariable("orderId")Long orderId){
        //访问当前接口 希望让浏览器跳转到支付宝的支付页
        // 可以使用alipay的sdk工具类：封装一个自动提交的form表单给浏览器

        String formStr = alipayService.submitAlipay(orderId);
        log.info(formStr);
        return Result.ok(formStr);
    }
    //如果不返回"success"字符串，支付宝会一直重复调用当前接口保证用户支付结果可以传给我们
    @Operation(summary = "异步回调接口：接收用户支付的结果")
    @PostMapping("alipayNotifyUrl")
    public String alipayCallback(@RequestParam Map<String,String> params){
        /*
            保证幂等性：因为支付宝可能多次回调当前接口
                - 处理回调业务时，可以根据回调的订单编号判断是否已经处理过该订单的回调业务 如果已经处理了 不再处理
                - 1、访问支付宝支付页时：
                    生成支付日志默认状态为待支付，保存到payment_info表中
                - 2、用户支付成功回调时：
                    2.1 幂等性处理
                        使用订单编号 查询日志表中的 当前订单编号是否存在 是否待付款 如果是 代表回调请求业务第一次执行
                    2.2 支付金额校验
                        获取回调参数中用户实际支付金额 和 数据库该订单的金额比较

            业务：
                验签：防止回调的数据被篡改
                验证用户支付的金额是否正确

                1、更新库存
                2、更新商品销量
                3、修改订单的状态
         */
//        log.info("回调参数列表:{}" ,params);
        return alipayService.alipayCallback(params);
    }
}
